home *** CD-ROM | disk | FTP | other *** search
/ Delphi Programmer's Power Pack / Delphi Volume 1.iso / e_to_l / fbuilder / vb / fbcalc.bas
Encoding:
BASIC Source File  |  1996-09-15  |  9.6 KB  |  256 lines

  1. '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2. '
  3. ' FORMULABUILDER Version 1.0
  4. ' An Advanced Expression Parsing/Evaluation Engine
  5. ' Copyright (c) 1995 Clayton Collie, All Rights Reserved
  6. '
  7. ' Published by YGB Software, Inc.
  8. ' Contact us via e-mail at 103515.1757@compuserve.com
  9. '
  10. ' Or Write us at
  11. '
  12. ' 161 Pearl St.
  13. ' Paterson, NJ 07501
  14. ' USA
  15. '
  16. '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  17.  
  18.  
  19. ':::::::::::: VB Header for Formula Builder DLL :::::::::::::::::::::
  20.  
  21. Option Explicit
  22.  
  23. Global Const MAXFUNCPARAMS = 16  'Functions can have up to MAXFUNCPARAMS parameters
  24. Global Const vtINTEGER = 0
  25. Global Const vtBOOLEAN = 1
  26. Global Const vtCHAR = 2
  27. Global Const vtFLOAT = 3
  28. Global Const vtSTRING = 4
  29. Global Const vtDATE = 9
  30. Global Const vtBOOL = 10
  31. Global Const vtNONE = 13
  32. Global Const vtTypeClash = 14
  33. Global Const vtTypeMismatch = vtTypeClash
  34.  
  35.  
  36. '*
  37. '*  Error Codes
  38. '*
  39.  
  40. Global Const INVALID_VARIABLE = -9999   '* Arbitrary but (hopefully) unique
  41.  
  42. Global Const EXPR_SUCCESS = 1
  43. Global Const EXPR_MISSING_PAREN = 2
  44. Global Const EXPR_BAD_EXPRESSION = 3
  45. Global Const EXPR_BAD_ASSIGNMENT = 4
  46. Global Const EXPR_UNKNOWN_IDENT = 5
  47. Global Const EXPR_LINE_TOO_LONG = 6
  48. Global Const EXPR_INVALID_TOKEN = 7
  49. Global Const EXPR_INVALID_CHAR = 8
  50. Global Const EXPR_MISSING_PARAM = 9
  51. Global Const EXPR_TYPE_MISMATCH = 10
  52. Global Const EXPR_INVALID_NUMBER = 11
  53. Global Const EXPR_MISSING_VARIABLE = 12
  54. Global Const EXPR_INVALID_VARIABLE = 12
  55. Global Const EXPR_INVALID_FUNCTION = 13
  56. Global Const EXPR_ZERO_DIVISION = 14
  57. Global Const EXPR_STACK_OVERFLOW = 15
  58. Global Const EXPR_UNEXPECTED_EOS = 16
  59. Global Const EXPR_INVALID_DATE = 17
  60. Global Const EXPR_IDENTIFIER_EXPECTED = 18
  61. Global Const EXPR_RANGE_ERROR = 19
  62. Global Const EXPR_DOMAIN_ERROR = 20
  63. Global Const EXPR_MATH_ERROR = 21
  64. Global Const EXPR_FP_OVERFLOW = 22
  65. Global Const EXPR_FP_UNDERFLOW = 23
  66. Global Const EXPR_INT_OVERFLOW = 24
  67. Global Const EXPR_INVALID_OP = 25
  68. Global Const EXPR_VARIABLE_EXPECTED = 26
  69. Global Const EXPR_MISSING_OPERATOR = 27
  70. Global Const EXPR_MISSING_OPERAND = 28
  71. Global Const EXPR_CONSTANT_EXPECTED = 29
  72. Global Const EXPR_DUPLICATE_IDENT = 30
  73. Global Const EXPR_SYNTAX_ERROR = 31
  74. Global Const EXPR_CONVERT_ERROR = 32
  75. Global Const EXPR_INVALID_TYPE = 33
  76. Global Const EXPR_INVALID_HANDLE = 50
  77. Global Const EXPR_INVALID_CALLBACK = 51
  78. Global Const EXPR_FORMULA_TOO_COMPLEX = 54
  79.  
  80.  
  81. ':::::::::::::::Engine initialization and shutdown:::::::::::::
  82.  
  83.   Declare Function FBInitExpression& Lib "FBCALC.DLL" (ByVal Exprdata&)
  84.   Declare Function FBFreeExpression% Lib "FBCALC.DLL" (ByVal handle&)
  85.  
  86. '::::::::::::::::::::: Expression Manipulation ::::::::::::::::::::
  87.  
  88.   Declare Function FBSetExpression% Lib "FBCALC.DLL" (ByVal handle&, ByVal expr$)
  89.  
  90.   Declare Function FBReparseExpression% Lib "FBCALC.DLL" (ByVal handle&)
  91.  
  92.   Declare Function FBClearExpression% Lib "FBCALC.DLL" (ByVal handle&)
  93.  
  94.   Declare Function FBGetExpression% Lib "FBCALC.DLL" (ByVal handle&, ByVal lpszResult$, ByVal maxlen%)
  95.  
  96. '::::::::::::::::::::: Expression Evaluation :::::::::::::::::::::::
  97.  
  98. '******************************************************************
  99. 'determine the result type of the expression. Returns one of the
  100. ' vtXXX constants, vtTYPEMISMATCH for an invalid expression
  101. '******************************************************************
  102.  
  103.   Declare Function FBGetReturnType% Lib "FBCALC.DLL" (ByVal handle&)
  104.  
  105. '*********************************************************************
  106. '  Evaluate the expression, returning a maximum of maxlen characters
  107. '  of the null-terminated string result in the buffer/string pointed to
  108. '  by outbuf
  109. '**********************************************************************
  110.  
  111.  
  112.   Declare Function FBEvaluate% Lib "FBCALC.DLL" (ByVal handle&, ByVal outbuf$, ByVal maxlen%)
  113.  
  114. '*
  115. '* Get Results in native types
  116. '*
  117.  
  118.   Declare Function FBGetStringResult% Lib "FBCALC.DLL" (ByVal handle&, ByVal value$, ByVal maxlen)
  119.   Declare Function FBGetFloatResult% Lib "FBCALC.DLL" (ByVal handle&, value#)
  120.   Declare Function FBGetBooleanResult% Lib "FBCALC.DLL" (ByVal handle&, value%)
  121.   Declare Function FBGetIntResult% Lib "FBCALC.DLL" (ByVal handle&, value&)
  122.   Declare Function FBGetDateResult% Lib "FBCALC.DLL" (ByVal handle&, value#)
  123.  
  124.  
  125. '*************************************************************************
  126. ' Perform a single operation expression evaluation. This is not the most
  127. ' efficient method of evaluation when the expression remains the same
  128. '*************************************************************************
  129.  
  130.   Declare Function EvalExpression% Lib "FBCALC.DLL" (ByVal expr$, retType%, ByVal buf$, ByVal maxlen%)
  131.  
  132. ' ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
  133. ' Internal Variable handling routines. NOTE ! If the variable callbacks are }
  134. ' implemented, the evaluation engine will not see the variables added       }
  135. ' by FBAddvariable                                                          }
  136. ' ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
  137.  
  138. ' Add a variable of type Vtype (see vtXXX constants) to the Expression Engine
  139.  
  140.   Declare Function FBAddVariable% Lib "FBCALC.DLL" (ByVal handle&, ByVal varname$, ByVal vtype%)
  141.  
  142. '******************************************************************
  143. 'Parse the string expression expr, and create a variable with its
  144. 'type and value
  145. '******************************************************************
  146.  
  147.  Declare Function FBParseAddVariable% Lib "FBCALC.DLL" (ByVal handle&, ByVal vname$, ByVal expr$)
  148.  
  149. '*
  150. '* Set the value of variable vname from the string value
  151. '*
  152.  
  153.   Declare Function FBSetVarFromString% Lib "FBCALC.DLL" (ByVal handle&, ByVal vname$, ByVal value$)
  154.  
  155.   Declare Function FBSetStringVariable% Lib "FBCALC.DLL" (ByVal handle&, ByVal vname$, ByVal value$)
  156.   Declare Function FBSetIntegerVariable% Lib "FBCALC.DLL" (ByVal handle&, ByVal vname$, ByVal value&)
  157.   Declare Function FBSetFloatVariable% Lib "FBCALC.DLL" (ByVal handle&, ByVal vname$, ByVal value#)
  158.   Declare Function FBSetBooleanVariable% Lib "FBCALC.DLL" (ByVal handle&, ByVal vname$, ByVal value%)
  159.   Declare Function FBSetDateVariable% Lib "FBCALC.DLL" (ByVal handle&, ByVal vname$, ByVal value#)
  160.  
  161.  
  162. '*
  163. '*  Get Variable Values
  164. '*
  165.  
  166.   Declare Function FBGetVarAsString% Lib "FBCALC.DLL" (ByVal handle&, ByVal vname$, ByVal value$, ByVal maxlen%)
  167.  
  168.   Declare Function FBGetStringVariable% Lib "FBCALC.DLL" (ByVal handle&, ByVal vname$, ByVal value$, ByVal maxlen%)
  169.   Declare Function FBGetIntegerVariable% Lib "FBCALC.DLL" (ByVal handle&, ByVal vname$, value&)
  170.   Declare Function FBGetFloatVariable% Lib "FBCALC.DLL" (ByVal handle&, ByVal vname$, value#)
  171.   Declare Function FBGetBooleanVariable% Lib "FBCALC.DLL" (ByVal handle&, ByVal vname$, value%)
  172.   Declare Function FBGetDateVariable% Lib "FBCALC.DLL" (ByVal handle&, ByVal vname$, value#)
  173.   Declare Function FBPeekVarVB% Lib "FBCALC.DLL" (ByVal handle&, ByVal vno%, ByVal vname$, ByVal maxnamelen%, vtype%, ByVal value$, ByVal maxvallen%)
  174.  
  175.   Declare Function FBFreeVariable% Lib "FBCALC.DLL" (ByVal handle&, ByVal vname$)
  176.  
  177.   Declare Function FBFreeVariableList% Lib "FBCALC.DLL" (ByVal handle&)
  178.  
  179.   Declare Function FBGetVariableCount% Lib "FBCALC.DLL" (ByVal handle&)
  180.  
  181. ':::::::::::::::::::::::: CONSTANTS :::::::::::::::::::::::::::::::::::'
  182.  
  183.  Declare Function FBParseAddConst% Lib "FBCALC.DLL" (ByVal vname$, ByVal expr$)
  184.  Declare Function FBAddStringConstant% Lib "FBCALC.DLL" (ByVal cname$, ByVal value$)
  185.  Declare Function FBAddDateConstant% Lib "FBCALC.DLL" (ByVal cname$, ByVal value#)
  186.  Declare Function FBAddNumericConstant% Lib "FBCALC.DLL" (ByVal cname$, ByVal value#)
  187.  Declare Function FBAddBooleanConstant% Lib "FBCALC.DLL" (ByVal cname$, ByVal value%)
  188.  Declare Function FBFreeConstant% Lib "FBCALC.DLL" (ByVal cname$)
  189.  Declare Function FBFreeConstants% Lib "FBCALC.DLL" ()
  190.  Declare Function FBGetConstAsString% Lib "FBCALC.DLL" (ByVal handle&, ByVal cname$, ByVal value$, ByVal maxlen%)
  191.  
  192. '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  193.  
  194.  ' Error handling
  195.  
  196.   Declare Sub FBGetErrorString Lib "FBCALC.DLL" (ByVal iEcode%, ByVal lpszBuf$, ByVal iBuflen%)
  197.  
  198.  
  199. '*::::::::::::::::: Function Management Routines:::::::::::::::::::::
  200.  
  201.   Declare Function FBGetFunctionCount% Lib "FBCALC.DLL" ()
  202.  
  203.  
  204. '*:::::::::::::::::::::::: Utility Routines ::::::::::::::::::::::::::
  205.  
  206.   Declare Sub FBlpzToDate Lib "FBCALC.DLL" (ByVal source$, value#)
  207.  
  208. Function FBGetVariableType% (ByVal handle&, ByVal vname$)
  209.  
  210. ' Utility routine to get the type of a variable
  211.  
  212.    Dim varcnt%, vtype%
  213.    Dim vno%, status_%
  214.    Dim tmpname  As String * 33
  215.    Dim tmpvalue As String * 2  'were not interested in the value
  216.  
  217.    FBGetVariableType = vtNONE
  218.    varcnt% = FBGetVariableCount%(handle&)
  219.    vname$ = UCase$(Trim$(vname$))
  220.    For vno% = 0 To varcnt% - 1
  221.        status_% = FBPeekVarVB%(handle&, vno%, tmpname$, 32, vtype%, tmpvalue$, 1)
  222.        If vname$ = tmpname$ Then
  223.           FBGetVariableType% = vtype%
  224.           Exit Function
  225.        End If
  226.    Next
  227.  
  228. End Function
  229.  
  230. ' Simple wrapper around FBGetErrorString
  231. '
  232. Function GetFBErrorText$ (ByVal errorcode%)
  233.   Dim errorText As String * 121
  234.  
  235.   FBGetErrorString errorcode%, errorText$, 120
  236.  
  237.   GetFBErrorText$ = errorText$
  238.  
  239. End Function
  240.  
  241. Function VarTypeToString$ (ByVal vtype%)
  242.    Dim S$
  243.  
  244.    S$ = "None"
  245.    Select Case vtype%
  246.       Case vtINTEGER: S$ = "Integer"
  247.       Case vtBOOLEAN: S$ = "Boolean"
  248.       Case vtCHAR:  S$ = "Char"
  249.       Case vtSTRING: S$ = "String"
  250.  '    Case vtPOINTER: S$ = "Pointer"
  251.       Case vtDATE: S$ = "Date"
  252.    End Select
  253.    VarTypeToString$ = S$
  254. End Function
  255.  
  256.